home *** CD-ROM | disk | FTP | other *** search
/ BCI NET / BCI NET Dec 94.iso / archives / telecomm / bbs / maxsdoors2.lha / TopDL10.lha / topdl.p < prev    next >
Text File  |  1993-12-21  |  5KB  |  218 lines

  1. Program TopDL;
  2. {
  3. Program will list each record and either (i) edit one member of the
  4. linked list or (ii) append a new entry to the linked list.  The linked
  5. list will resemble a quicksort tree for speed.
  6. }
  7.  
  8. {$I "Include:Utils/StringLib.i"}
  9.  
  10. {$O-} { turn off IO error checking }
  11.  
  12. const
  13.     StdInName : String = NIL;
  14.     StdOutName : String = NIL;
  15.     filecount : integer = 0;
  16.  
  17. type
  18.     llisttype = record
  19.     filename : string;
  20.     count : integer;
  21.     nextup,
  22.     nextdn : ^llisttype
  23.     end;
  24.     llistptrtype = ^llisttype;
  25.  
  26. var
  27.     output_file,
  28.     input_file : text;
  29.     fname : string;
  30.     mychar : char;
  31.     thelist : llistptrtype;
  32.     top10array : array [1..10] of llistptrtype;
  33.     counter,
  34.     counter2 : short;
  35.  
  36. {***************************************************************************}
  37. {****************************** FUNCTION CALLS *****************************}
  38. {***************************************************************************}
  39.  
  40. function ucase(anystring:string):string;
  41.  
  42. var
  43.     tmparray : array [0..32] of char;
  44.     tmpstring : string;
  45.  
  46. begin
  47.     tmpstring := adr(tmparray);
  48.     for counter := 0 to strlen(anystring)-1 do
  49.     tmpstring[counter] := toupper(anystring[counter]);
  50.     tmpstring[counter+1] := '\0';
  51.     ucase := strdup(tmpstring)
  52. end;
  53.  
  54. {***************************************************************************}
  55.  
  56. function add_dl(alist:llistptrtype):llistptrtype;
  57. {
  58. adds download entry to the linked list
  59. }
  60. begin
  61.     inc(filecount);
  62.     if alist=NIL then begin
  63.     new(alist);
  64.     alist^.filename := strdup(fname);
  65.     alist^.count := 1;
  66.     alist^.nextup := NIL;
  67.     alist^.nextdn := NIL;
  68.     add_dl := alist
  69.     end;
  70.  
  71.     if strcmp(ucase(alist^.filename),ucase(fname))=0 then begin
  72.     inc(alist^.count);
  73.     add_dl := alist
  74.     end;
  75.  
  76.     if strcmp(ucase(alist^.filename),ucase(fname))<0 then begin
  77.     alist^.nextup := add_dl(alist^.nextup);
  78.     add_dl := alist
  79.     end;
  80.  
  81.     if strcmp(ucase(alist^.filename),ucase(fname))>0 then begin
  82.     alist^.nextdn := add_dl(alist^.nextdn);
  83.     add_dl := alist
  84.     end
  85. end;
  86.  
  87. {***************************************************************************}
  88.  
  89. function find_top_n(number:short):llistptrtype;
  90. {
  91. finds first top count of downloads excluding top10array[n-1],
  92. top10array[n-2],...,top10array[1] and returns a pointer to that record
  93. }
  94.  
  95.     function traverse(listhead,topptr:llistptrtype):llistptrtype;
  96.     {
  97.     traverses the full tree and returns the entry with the number'th highest
  98.     count
  99.     }
  100.  
  101.     function notused(tmpptr:llistptrtype):boolean;
  102.     {
  103.     checks to see if the given pointer is the same as any of the above
  104.     top10array[] pointers
  105.     }
  106.     begin
  107.         for counter2 := 1 to number-1 do
  108.         if tmpptr=top10array[counter2] then
  109.             notused := FALSE;
  110.         notused := TRUE
  111.     end;
  112.  
  113.     begin
  114.     if listhead=NIL then
  115.         traverse := topptr;
  116.  
  117.     topptr := traverse(listhead^.nextdn,topptr);
  118.  
  119.     if ((topptr=NIL) or (listhead^.count>topptr^.count))
  120.       and notused(listhead) then
  121.         topptr := listhead;
  122.  
  123.     traverse := traverse(listhead^.nextup,topptr);
  124.     end;
  125.  
  126. begin
  127.     find_top_n := traverse(thelist,NIL)
  128. end;
  129.  
  130. {***************************************************************************}
  131.  
  132. procedure displayit;
  133. {
  134. displays the information as an ANSI output screen - paragon style...
  135. }
  136. begin
  137.     counter := 1;
  138.     counter2 := 1;
  139.     if open("bbs:text/topdl.text",output_file) then begin
  140.     if reopen("doors:topdl/topdl.text",input_file) then begin
  141.         while not eof(input_file) do begin
  142.         write(output_file,input_file^);
  143.         read(input_file,mychar)
  144.         end;
  145.         close(input_file)
  146.     end;
  147.     if reopen("doors:topdl/topdl.upd",input_file) then begin
  148.         while not eof(input_file) do begin
  149.         if input_file^='%' then begin
  150.             if top10array[counter]=NIL then
  151.             write(output_file,'Cnone')
  152.             else begin
  153.             case strlen(top10array[counter]^.filename) of
  154.                 1..23 : write(output_file,'',16-(strlen(top10array[counter]^.filename) shr 1),'C');
  155.                 24,25 : write(output_file,'    ');
  156.                 26,27 : write(output_file,'   ');
  157.                 28,29 : write(output_file,'  ');
  158.                 30,31 : write(output_file,' ');
  159.             end;
  160.             write(output_file,top10array[counter]^.filename);
  161.             end;
  162.             inc(counter)
  163.         end else if input_file^='&' then begin
  164.             if top10array[counter2]=NIL then
  165.             write(output_file,'   0')
  166.             else
  167.             write(output_file,top10array[counter2]^.count:4);
  168.             inc(counter2)
  169.         end else
  170.             write(output_file,input_file^);
  171.         read(input_file,mychar)
  172.         end;
  173.         close(input_file)
  174.     end;
  175.     write(output_file,'%Z');
  176.     close(output_file)
  177.     end
  178. end;
  179.  
  180. {***************************************************************************}
  181. {******************************* MAIN PROGRAM ******************************}
  182. {***************************************************************************}
  183.  
  184. begin
  185.     fname := allocstring(32);
  186.  
  187.     if reopen("bbs:logfiles/dnloadlog.text",input_file) then begin
  188.     while not eof(input_file) do begin
  189.         if input_file^ <> 'N' then
  190.         readln(input_file)
  191.         else begin
  192.         for counter := 1 to 9 do
  193.             repeat
  194.             read(input_file,mychar)
  195.             until mychar=' ';
  196.         readln(input_file,fname);
  197.         counter := -1;
  198.         repeat
  199.             inc(counter);
  200.             if fname[counter]=',' then
  201.             fname[counter] := '\0'
  202.         until fname[counter]='\0';
  203.         thelist := add_dl(thelist)
  204.         end;
  205.     end;
  206.     close(input_file);
  207.  
  208.     for counter := 1 to 10 do
  209.         if counter>filecount then
  210.         top10array[counter] := NIL
  211.         else
  212.         top10array[counter] := find_top_n(counter);
  213.  
  214.     displayit
  215.     end else
  216.     writeln('* COULD NOT OPEN bbs:logfiles/dnloadlog.text')
  217. end.
  218.